
A {
    while (TRUE) {
        P(full_A); // 如果 A 信箱没有邮件，那么阻塞
        P(mutex_A); // 互斥访问 A 信箱
        从 A 的信箱中取出一个邮件;
        V(mutex_A);
        V(empty_A); // 通知 B，A 信箱可以放一个邮件
        回答问题并提出一个新问题;
        P(empty_B); // 如果 B 信箱装不下，那么阻塞
        P(mutex_B); // 互斥访问 B 信箱
        将新邮件放入 B 的信箱;
        V(mutex_B);
        V(full_B); // 通知 B，可以从 B 信箱取一个邮件
    }
}


B {
    while (TRUE) {
        P(full_B);  // 如果 B 信箱没有邮件，那么阻塞
        P(mutex_B); // 互斥访问 B 信箱
        从 B 的信箱中取出一个邮件;
        V(mutex_B);
        V(empty_B); // 通知 A，B 信箱可以再放一个邮件
        回答问题并提出一个新问题;
        P(empty_A); // 如果 A 信箱装满了，则阻塞
        P(mutex_A); // 互斥访问 A 信箱
        将新邮件放入 A 的信箱;
        V(mutex_A);
        V(full_A); // 通知 A，可以从 A 信箱取一个邮件
    }
}


